package lwk.juc.collection;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * @author:lwk
 * @create: 2022-08-12 22:04
 * @Description: List集合测试
 *
 * Set<String> set = new HashSet<>();<br>
 * 多个线程操作线程不安全的集合时（HashSet）,会发生并发修改异常.<br>
 * java.util.ConcurrentModificationException:并发修改异常.<br><br>
 * 解决方案：<br>
 * <pre>
 * 1、Set<String> set = Collections.synchronizedSet(new HashSet<>());
 * synchronizedSet就是在Set的操作外包加了一层synchronize同步控制,
 * 注意使用Iterator遍历时,异步修改Set的结构,同样也会发生并法修改异常.<br>
 * 2、Set<String> set = new CopyOnWriteArraySet<>();
 * CopyOnWrite,即COW,计算机程序设计领域的一种优化策略
 * 多个线程调用的时候，读取到的set是固定，修改的时候会先copy一份数据，修改完成之后覆盖原对象引用,由于写操作的开销大，所以多用于读多写少的时候，并且存在读到的数据不是最新的情况。
 * 读写分离
 * </pre>
 */

public class SetTest {
    public static void main(String[] args) throws InterruptedException {

        Set<String> set = new CopyOnWriteArraySet<>();
        for (int i = 1; i <= 100; i++) {
            new Thread(()->{
                set.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(set);
            }).start();
        }

        Thread.sleep(100);
        new Thread(()-> {
            Iterator<String> iterator = set.iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
        }).start();
        new Thread(()->{
            set.add(UUID.randomUUID().toString().substring(0,5));
            System.out.println(set);
        }).start();
    }
}
